/*
* Author:JacksonCoder
* CreateTime:
* Version: 1.0.0
*/

enum IpAddrKind {
    V4,
    V6,
}

enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

enum Message {
    Quit,
    Move { x: i32, y: i32 }, // 命名字段
    Write(String),
    ChangeColor(i32, i32, i32), //元组
}

// 枚举也可以有方法和关联函数，
impl Message {
    fn call(&self) {
        // 方法体
    }
}

// Option枚举: 处理空值
// enum Option<T> {
//     None,
//     Some(T),
// }

fn main() {
    let _four = IpAddrKind::V4;
    let _six = IpAddrKind::V6;

    let _home = IpAddr::V4(127, 0, 0, 1);
    let _loopback = IpAddr::V6(String::from("::1"));

    let m = Message::Write(String::from("hello"));
    m.call();

    // 泛型T 可以是任何类型
    let some_number = Some(5);
    let some_char = Some('e');
    let _another_number: Option<i32> = None; // 指定类型以避免推断错误
                                             // 注意：Rust 强制处理 None 情况，防止空指针错误。不能直接将 Option<i32> 与 i32 相加，必须先解包。

    value_in_cents(Coin::Quarter(()));

    let five = Some(5);
    let _six = plus_one(five);
    let _none = plus_one(None);

    // 通配符和 _：处理剩余情况。
    let dice_roll = 9;
    match dice_roll {
        3 => add_fancy_hat(),
        7 => remove_fancy_hat(),
        _ => (), // 无操作
    }

    //  if let 语法：简洁匹配
    let config_max = Some(3u8);
    if let Some(max) = config_max {
        print!("最大值为: {} \n", max);
    }
}

// 匹配 Option
fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}

// 匹配模式
#[derive(Debug)] // 用于打印
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(()), // 这里用 () 占位，需要啥换成对应类型
}

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => {
            println!("幸运便士！");
            1
        }
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("来自 {:?} 的 25 美分！", state);
            25
        } // 注意：如果遗漏变体，编译器会报错。match 是表达式，可以返回值。
    }
}
// ---------- 空函数 ----------
fn add_fancy_hat() {}
fn remove_fancy_hat() {}
